/**
 * @description users controller
 */

const { findUserList, updateUsers, getUsersCount, getCreatedCountMonthly } = require('../service/users')
const { SuccessRes, ErrorRes } = require('../res-model/index')
const { updateFailInfo, pageIndexFailInfo } = require('../res-model/failInfo')
const { parseNumberArr } = require('../utils/util')

/**
 * 查询用户列表
 * @param {string} keyword 搜索关键字
 */
async function getUserList(keyword = '', pageIndex, pageSize) {
  if (pageIndex && parseInt(pageIndex) <= 0) {
    return new ErrorRes(pageIndexFailInfo)
  }

  // 查询条件
  let whereOpt = {}
  if (keyword) {
    const keywordOpt = { $regex: keyword, $options: 'i' } //$regex 正则，用于实现模糊查询  $options: 'i' 忽略大小写

    whereOpt = {
      // 所有查询条件，$or 拼接
      $or: [{ username: keywordOpt }, { phoneNumber: keywordOpt }, { nickName: keywordOpt }]
    }
    const idKeyword = parseInt(keyword)
    // Number.isFinite()函数检查变量是否为数字，还检查其是否为有限值
    if (Number.isFinite(idKeyword)) {
      whereOpt.$or.push({ id: idKeyword })
    }
  }

  const pageOpt = {
    ...(pageIndex && { pageIndex: parseInt(pageIndex) - 1 }),
    ...(pageSize && { pageSize: parseInt(pageSize) })
  }

  const res = await findUserList(whereOpt, pageOpt)

  return new SuccessRes(res)
}

/**
 * 批量修改 isFrozen
 * @param {string} ids 如 '1' '1,2,3'
 * @param {boolean} isFrozen 是否冻结
 */
async function updateIsFrozen(ids = '', isFrozen = false) {
  // 将 ids 字符串变为数组
  const idsArr = parseNumberArr(ids)
  if (idsArr.length === 0) return new ErrorRes(updateFailInfo)

  const result = await updateUsers({ $set: { isFrozen } }, { id: { $in: idsArr } })

  if (result) return new SuccessRes()
  return new ErrorRes(updateFailInfo)
}

/**
 * 获取总数
 */
async function getCount() {
  // 总数
  const count = await getUsersCount()

  // 活跃人数，最后登录时间在 3 个月以内的
  const d = new Date()
  const limitDate = new Date(d.getTime() - 90 * 24 * 60 * 60 * 1000) // 90 天之前
  const active = await getUsersCount({
    latestLoginAt: { $gte: limitDate }
  })

  return new SuccessRes({
    count,
    active
  })
}

/**
 * 按月统计创建量
 */
async function getMonthlyCount() {
  // 一年的时间范围
  const d = new Date() // new Date() 生成是世界标准时区；和我们相差8个小时
  const startTime = new Date(d.getTime() - 365 * 24 * 60 * 60 * 1000) // 一年之前
  const endTime = d

  const result = await getCreatedCountMonthly(startTime, endTime)
  console.log('getMonthlyCount', result)

  const resData = result.map(item => {
    return {
      month: item._id,
      count: item.count
    }
  })

  return new SuccessRes(resData)
}

module.exports = {
  getUserList,
  updateIsFrozen,
  getCount,
  getMonthlyCount
}
